package main;

import java.util.ArrayList;
import java.util.Iterator;

import cartes.Carte;
import cartes.ComparateurCartes;
import cartes.Denomination;

public class AnalyseurMain {
	
	public static boolean estValide(Main main) {
		if(main != null) {
			return (main.size() >= 5);
		}
		
		return false;
	}
	
	private static Main enleveDoublons(Main main) {
		if(main != null && estValide(main)) {
			main.sortDes();
			Main principale = new Main();
			Iterator<Carte> iterator = main.iterator();
			Carte carte = null;
			ComparateurCartes comparateur = new ComparateurCartes();
			
			while(iterator.hasNext()) {
				carte = iterator.next();
				if(principale.size() == 0) {
					principale.add(carte);
				}
				else {
					if(comparateur.compareToCarteDenomination(principale.get(principale.size() - 1), carte) != 0) {
						principale.add(carte);
					}
				}
			}
			
			if(principale.size() != 0) {
				return principale;
			}
		}
		
		return new Main();
	}
	
	public static ArrayList<Main> separeEnCouleur(Main main) {
		if(main != null && estValide(main)) {
			main.sortCouleur();
			Iterator<Carte> iterator = main.iterator();
			ArrayList<Main> mains = new ArrayList<Main>();
			Main principale = new Main();
			Carte carte = null;
			ComparateurCartes comparateur = new ComparateurCartes();
			
			while(iterator.hasNext()) {
				carte = iterator.next();
				if(principale.size() == 0) {
					principale.add(carte);
				}
				else {
					if(comparateur.compareToCarteCouleur(carte, principale.get(principale.size() - 1)) == 0) {
						principale.add(carte);
					}
					else {
						if(principale.size() >= 5) {
							//principale.trim(5);
							mains.add(principale);
						}
						principale = new Main();
						principale.add(carte);
					}
				}
			}
			
			if(principale.size() >= 5) {
				//principale.trim(5);
				mains.add(principale);
			}
			
			return mains;
		}
		
		return new ArrayList<Main>();
	}
	
	public static Main estEnSequence(Main main) {
		if(main != null && estValide(main)) {
			main.sortDes();
			Iterator<Carte> iterator = enleveDoublons(main).iterator();
			Main principale = new Main();
			Carte carte = null;
			ComparateurCartes comparateur = new ComparateurCartes();
			
			while(iterator.hasNext()) {
				carte = iterator.next();
				if(principale.size() == 0) {
					principale.add(carte);
				}
				else {
					if(comparateur.compareToCarteDenomination(principale.get(principale.size() - 1), carte) == 1) {
						principale.add(carte);
						if(principale.size() == 5) {
							return principale;
						}
					}
					else {
						principale = new Main();
						principale.add(carte);
					}
				}
			}
		}
		
		return new Main();
	}
	
	public static Main estEnSequenceRoyale(Main main) {
		if(main != null && estValide(main)) {
			main.sortCouleur();
			Iterator<Carte> iterator = enleveDoublons(main).iterator();
			Main principale = new Main();
			Carte carte = null;
			int index = 0;
			ComparateurCartes comparateur = new ComparateurCartes();
			
			while(iterator.hasNext()) {
				carte = iterator.next();
				if(principale.size() == 0) {
					if(comparateur.compareToDenomination(carte, Denomination.AS) == 0) {
						principale.add(carte);
						index--;
					}
				}
				else {
					if(comparateur.compareToDenomination(carte, Denomination.DENOMINATIONS.get(Denomination.AS.getIndex() - index)) == 0) {
						principale.add(carte);
						if(principale.size() == 5) {
							return principale;
						}
						index--;
					}
					else {
						index = 0;
						principale = new Main();
					}
				}
			}
		}
		
		return new Main();
	}
	
	public static ArrayList<Main> separeEnN(Main main, int nombre) {
		if(main != null && estValide(main)) {
			main.sortDes();
			Iterator<Carte> iterator = main.iterator();
			ArrayList<Main> mains = new ArrayList<Main>();
			Main principale = new Main();
			Carte carte = null;
			ComparateurCartes comparateur = new ComparateurCartes();
			
			while(iterator.hasNext()) {
				carte = iterator.next();
				if(principale.size() == 0) {
					principale.add(carte);
				}
				else {
					if(comparateur.compareToCarteDenomination(carte, principale.get(principale.size() - 1)) == 0) {
						principale.add(carte);
					}
					else {
						if(principale.size() != nombre) {
							principale = new Main();
							principale.add(carte);
						}
						else if(principale.size() == nombre) {
							mains.add(principale);
							principale = new Main();
							principale.add(carte);
						}
					}
				}
			}
			
			if(principale.size() == nombre) {
				mains.add(principale);
			}
			
			return mains;
		}
		
		return new ArrayList<Main>();
	}
	
	public static int determinePoidsDuRang(Main main) {
		if(main != null) {
			int poids = 0;
			int compte = 0;
			Iterator<Carte> iterator = main.iterator();
			
			while(iterator.hasNext() && compte < 5) {
				poids += iterator.next().getValeur();
				compte++;
			}
			
			return poids;
		}
		
		return 0;
	}
	
	public static int determinePoidsDesKickersSansRang(Main main, Main rang) {
		if(main != null && estValide(main)) {
			int compte = 0;
			int poids = 0;
			Main principale = new Main();
			Carte carte = null;
			ComparateurCartes comparateur = new ComparateurCartes();
			Iterator<Carte> iterator = main.iterator();
			
			while(iterator.hasNext()) {
				principale.add(iterator.next().clone());
			}
			
			iterator = rang.iterator();
			
			while(iterator.hasNext()) {
				carte = iterator.next();
				for(int i = 0; i < principale.size(); i++) {
					if(comparateur.compare(carte, principale.get(i)) == 0) {
						principale.remove(i);
						i = principale.size();
						compte++;
					}
				}
			}
			
			principale.sortDes();
			
			iterator = principale.iterator();
			
			for(int i = 0; i < (5 - compte); i++) {
				poids += iterator.next().getValeur();
			}
			
			return poids;
		}
		
		return 0;
	}
	
	public static Main retourneMeilleurRang(ArrayList<Main> mains) {
		if(mains != null && mains.size() > 0) {
			Main meilleureRang = null;
			
			for(int i = 0; i < mains.size(); i++) {
				if(meilleureRang == null) {
					meilleureRang = mains.get(i);
				}
				if(determineValeur(meilleureRang) < determineValeur(mains.get(i))) {
					meilleureRang = mains.get(i);
				}
			}
			
			return meilleureRang;
		}
		
		return new Main();
	}
	
	public static int determineValeur(Main main) {
		if(main != null) {
			Iterator<Carte> iterator = main.iterator();
			int valeur = 0;
			int compte = 0;
			
			while(iterator.hasNext() && compte < 5) {
				valeur += iterator.next().getValeur();
				compte++;
			}
			
			return valeur;
		}

		return 0;
	}

}